package cn.skyclass.utils
{
	import cn.skyclass.beans.LogInfoBean;
	import cn.skyclass.net.RoHelper;
	import cn.skyclass.net.RpcHelper;
	import cn.skyclass.net.WsHelper;
	
	import mx.rpc.Fault;
	
	/**
	 * 使用 RemoteObject 或 WebService 来记录客户端日志，
	 * 将客户端的日志信息发送到服务器端，然后在服务器端进行记录。
	 * 如果两种通信方式都可以使用，则优先使用 RemoteObject 。
	 */
	public class Log4Flex
	{
		/**
		 * wsdl : 一个 WebService 的 wsdl，其中包含接收日志信息的方法
		 * destination : 一个 RemoteObject 的 destination，其中包含接收日志信息的方法
		 */
		public function Log4Flex(wsdl:String=null, destination:String=null, 
			logMethodName:String="clientLog"){
			this.wsdl = wsdl ? wsdl : defaultWsdl;
			this.destination = destination ? destination : defaultDestination;
			this.logMethodName = logMethodName;
		}
		
		
		/**
		 * 默认的 destination，当没有设置实例的 destination 属性时将使用此值
		 * 初始值为空，若要使用此值需先行设定
		 */
		public static var defaultDestination:String;
		
		/**
		 * 默认的 wsdl，当没有设置实例的 wsdl 属性时将使用此值
		 * 初始值为空，若要使用此值需先行设定
		 */
		public static var defaultWsdl:String;
		
		
		/**
		 * 一个 RemoteObject 的 destination，其中包含接收日志信息的方法
		 */
		protected var destination:String;
		
		/**
		 * 一个 WebService 的 wsdl，其中包含接收日志信息的方法
		 */
		protected var wsdl:String;
		
		
		/**
		 * 记录日志信息的方法名称，此方法的接口需定义如下：
		 * public OperationResult clientLog(LogInfoBean value);
		 */
		public var logMethodName:String = "clientLog";
		
				
		/**
		 * 记录错误信息
		 * @err : 需要记录的错误实例
		 */
		public function error(err:Error):void{			
			var value:LogInfoBean = new LogInfoBean();
			value.initByError(err);
			doLog(value);
		}
		
		/**
		 * 记录普通的日志信息
		 * @msg : 需要记录的信息
		 */		
		public function info(message:String):void{
			var value:LogInfoBean = new LogInfoBean();
			value.initByInfo(message);
			doLog(value); 
		}
		
		/**
		 * 记录 web service 调用产生的错误日志信息
		 * @fault : 需要记录的信息
		 */			
		public function fault(fault:Fault):void{
			var value:LogInfoBean = new LogInfoBean();
			value.initByFault(fault);
			doLog(value);
		}
		
		protected function doLog(value:LogInfoBean):void{
			try{
				var dao:RpcHelper;
				if(this.destination){
					dao = new RoHelper(destination);
				}else if(this.wsdl){
					dao = new WsHelper(wsdl);
				}else{
					return;
				}
				
				dao.logErrorInfo = false;
				dao.traceArgsInfo = false;
				dao.showBusyCursor = false;
				dao.execute(this.logMethodName, value); 
			}catch(e:Error){
				trace(e);
				trace("write flex log failed.");
			}						
		}
		
	}
}